﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Misuzilla.Crigate.Handler
{
    /// <summary>
    /// ハンドラの型情報を必要なアプリケーションドメインごとに分けて管理します。
    /// </summary>
    public class HandlerTypeInfoSet
    {
        private List<HandlerTypeInfo> _handlerTypeInfoList = new List<HandlerTypeInfo>();

        /// <summary>
        /// すべてのハンドラの型のコレクション
        /// </summary>
        public ICollection<HandlerTypeInfo> AllHandlers
        {
            get { return _handlerTypeInfoList.AsReadOnly(); }
        }
        
        /// <summary>
        /// 親ドメインに読み込まれる必要のあるハンドラの型のコレクション
        /// </summary>
        public ICollection<HandlerTypeInfo> ParentDomainHandlers
        {
            get { return _handlerTypeInfoList.FindAll(m => m.IsRequireParentDomain).AsReadOnly(); }
        }

        /// <summary>
        /// 分離ドメインに読み込まれる必要のあるハンドラの型のコレクション
        /// </summary>
        public ICollection<HandlerTypeInfo> IsolatedDomainHandlers
        {
            get { return _handlerTypeInfoList.FindAll(m => m.IsRequireIsolatedDomain).AsReadOnly(); }
        }
        
        /// <summary>
        /// 共有ドメインに読み込まれる必要のあるハンドラの型の辞書
        /// </summary>
        public IDictionary<String, HandlerTypeInfo> SharedDomainHandlers
        {
            get
            {
                return _handlerTypeInfoList.FindAll(m => !String.IsNullOrEmpty(m.SharedAppDomainName)).ToDictionary(m => m.SharedAppDomainName);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="handlerTypeInfoList"></param>
        public void Add(IEnumerable<HandlerTypeInfo> handlerTypeInfoList)
        {
            _handlerTypeInfoList.AddRange(handlerTypeInfoList);
        }
    
        /// <summary>
        /// 
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        public HandlerTypeInfo FindByType(String typeName)
        {
            return _handlerTypeInfoList.Find(m => String.Compare(m.Type, typeName, true) == 0);
        }
    }
}
